//底层驱动相关
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "timer.h"
#include "wdg.h"
#include "stdbool.h"
#include "iic.h"
#include "AS5600.h"
#include "config.h"
#include "motor_pwm.h"
//usb底层驱动相关
#include "usb_lib.h"
#include "hw_config.h"
#include "usb_pwr.h"
//服务函数相关
#include "usbtask.h"
#include "ledtask.h"
#include "keytask.h"
#include "measuretask.h"
#include "ctrl.h"
//foc驱动
#include "foc_motor.h"
#include "fast_calculate.h"


//FreeRTOS相关
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "queue.h"

/************************************************

************************************************/


int main(void)
{
// NVIC_SetVectorTable(FIRMWARE_START_ADDR,0);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
    delay_init();//延时函数初始化
    v_led_init();
    v_key_init();
    v_iiC_init();
    v_magnetic_senser_init();
    usb_hid_init();
    configParamInit();
    v_motor_init();

    taskENTER_CRITICAL();           //进入临界区

    xTaskCreate(v_led_task,             "v_led_task",               100,    NULL,1,NULL);       //LED闪烁任务
    xTaskCreate(v_key_task,             "v_key_task",               50,     NULL,2,NULL);       //按键扫描任务
    xTaskCreate(v_motor_attitude_task,  "v_motor_attitude_task",    200,    NULL,3,NULL);       //电机状态获取任务
    xTaskCreate(configParamTask,        "configParamTask",          200,    NULL,4,NULL);       //参数存储任务
    xTaskCreate(v_control_task,         "v_control_task",           200,    NULL,2,NULL);       //电机控制任务

    taskEXIT_CRITICAL();            //退出临界区

    vTaskStartScheduler();          //开启任务调度
}

//char InfoBuffer[1000];                          //保存信息的数组
void vApplicationIdleHook(void)
{
    static u32 tickWatchdogReset = 0;

    portTickType tickCount = xTaskGetTickCount();

    if (tickCount - tickWatchdogReset > WATCHDOG_RESET_MS)
    {
        tickWatchdogReset = tickCount;
//        usb_printf("/*************打印任务信息*************/\r\n");
//        vTaskList(InfoBuffer);							//获取所有任务的信息
//        usb_printf("%s\r\n",InfoBuffer);					//通过串口打印所有任务的信息
        IWDG_Feed();
    }

}



